home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / nan_news / toolkit / restatt.asm < prev    next >
Assembly Source File  |  1991-08-15  |  7KB  |  165 lines

  1. ; File......: RESTATT.ASM
  2. ; Author....: Ted Means
  3. ; Date......: $Date:   15 Aug 1991 23:08:02  $
  4. ; Revision..: $Revision:   1.1  $
  5. ; Log file..: $Logfile:   E:/nanfor/src/restatt.asv  $
  6. ; This is an original work by Ted Means and is placed in the
  7. ; public domain.
  8. ;
  9. ; Modification history:
  10. ; ---------------------
  11. ;
  12. ; $Log:   E:/nanfor/src/restatt.asv  $
  13. ;  
  14. ;     Rev 1.1   15 Aug 1991 23:08:02   GLENN
  15. ;  Forest Belt proofread/edited/cleaned up doc
  16. ;  
  17. ;     Rev 1.0   12 Jun 1991 01:30:14   GLENN
  18. ;  Initial revision.
  19. ;
  20.  
  21.  
  22. ;  $DOC$
  23. ;  $FUNCNAME$
  24. ;     FT_RESTATT()
  25. ;  $CATEGORY$
  26. ;     Video
  27. ;  $ONELINER$
  28. ;     Restore the attribute bytes of a specified screen region.
  29. ;  $SYNTAX$
  30. ;     FT_RESTATT( <nTop>, <nLeft>, <nBottom>, <nRight>, <cAttributes> ) -> NIL
  31. ;  $ARGUMENTS$
  32. ;     <nTop>, <nLeft>, <nBottom>, and <nRight> define the screen region.
  33. ;     <cAttributes> is a character string containing the attribute bytes
  34. ;                   for the screen region.  This will most often be a string
  35. ;                   previously returned by FT_SAVEATT(), but any character
  36. ;                   string may be used (provided it is of the proper size).
  37. ;  $RETURNS$
  38. ;     NIL
  39. ;  $DESCRIPTION$
  40. ;     This function is similar to Clipper's RestScreen(), except that it only
  41. ;     restores the attribute bytes.  This is useful if you want to change the
  42. ;     screen color without affecting the text.
  43. ;
  44. ;     *** INTERNALS ALERT ***
  45. ;
  46. ;     This function calls the Clipper internal __gtMaxCol to obtain the
  47. ;     maximum column value for the current video mode.  If you're too gutless
  48. ;     to use internals, then this function isn't for you.
  49. ;  $EXAMPLES$
  50. ;     // Restore attributes of row 4
  51. ;     FT_RESTATT( 4, 0, 4, maxcol(), cBuffer)
  52. ;
  53. ;     // Restore attributes to middle of screen
  54. ;     FT_RESTATT(10,20,14,59,cBuffer)
  55. ;  $SEEALSO$
  56. ;     FT_SAVEATT()
  57. ;  $END$
  58. ;
  59.  
  60.         IDEAL
  61.  
  62. Public   FT_RESTATT
  63.  
  64. Extrn    __ParNI:Far
  65. Extrn    __ParC:Far
  66. Extrn    __gtMaxCol:Far                      ; INTERNAL!!  INTERNAL!!
  67.  
  68. Upper    EQU       Word Ptr BP - 2
  69. Left     EQU       Word Ptr BP - 4
  70. Lower    EQU       Word Ptr BP - 6
  71. Right    EQU       Word Ptr BP - 8
  72. MaxCol   EQU       Word Ptr BP - 10
  73.  
  74. Segment  _NanFor   Word      "CODE"
  75.          Assume    CS:_NanFor
  76.  
  77. Proc     FT_RESTATT          Far
  78.  
  79.          Push      BP                        ; Save BP
  80.          Mov       BP,SP                     ; Set up stack reference
  81.          Sub       SP,10                     ; Allocate space for locals
  82.  
  83.          Call      __gtMaxCol                ; Get current value of maxcol()
  84.          Inc       AX                        ; Get column count
  85.          Mov       [MaxCol],AX               ; Store in local
  86.  
  87.          Mov       AX,1                      ; Specify param #1
  88.          Push      AX                        ; Put on stack
  89.          Call      __ParNI                   ; Get value
  90.          Mov       [Upper],AX                ; Store in local
  91.  
  92.          Mov       AX,2                      ; Specify param #2
  93.          Push      AX                        ; Put on stack
  94.          Call      __ParNI                   ; Get value
  95.          Mov       [Left],AX                 ; Store in local
  96.  
  97.          Mov       AX,3                      ; Specify param #3
  98.          Push      AX                        ; Put on stack
  99.          Call      __ParNI                   ; Get value
  100.          Mov       [Lower],AX                ; Store in local
  101.  
  102.          Mov       AX,4                      ; Specify param #4
  103.          Push      AX                        ; Put on stack
  104.          Call      __ParNI                   ; Get value
  105.          Mov       [Right],AX                ; Store in local
  106.  
  107.          Mov       AX,5                      ; Specify param #5
  108.          Push      AX                        ; Put on stack
  109.          Call      __ParC                    ; Get pointer to buffer
  110.          Add       SP,10                     ; Realign stack
  111.  
  112. SetPtr:  Push      DS                        ; Save registers and ensure
  113.          Push      SI                        ; clear direction flag
  114.          Push      DI
  115.          CLD
  116.  
  117.          Mov       DS,DX                     ; Set up DS:SI to point to
  118.          Mov       SI,AX                     ; passed buffer
  119.          Xor       AX,AX                     ; Clear AX
  120.          Mov       ES,AX                     ; Point ES to low memory
  121.          Mov       AX,0B800h                 ; Initalize video base
  122.          Cmp       [Word Ptr ES:463h],3B4h   ; Monochrome?
  123.          JNE       SetVid                    ; No, continue
  124.          Mov       AX,0B000h                 ; Set video base to mono
  125.  
  126. SetVid:  Mov       ES,AX                     ; Set video base
  127.          Xor       DI,DI                     ; Start at offset 0
  128.          Mov       CX,[Lower]                ; Get lower row
  129.          Sub       CX,[Upper]                ; Subtract upper row
  130.          Inc       CX                        ; Get number of rows
  131.  
  132. Rows:    Mov       AX,CX                     ; Get row number
  133.          Sub       AX,[Lower]                ; Subtract last row
  134.          Dec       AX                        ; Get negation of row
  135.          Neg       AX                        ; Convert to abs()
  136.          Mul       [MaxCol]                  ; Multiply by column count
  137.          SHL       AX,1                      ; Multiply by two
  138.          Mov       BX,[Left]                 ; Get left column
  139.          SHL       BX,1                      ; Multiply by two
  140.          Inc       BX                        ; Point to attribute byte
  141.          Add       BX,AX                     ; Add rows * columns
  142.          Push      CX                        ; Save row indicator
  143.          Mov       CX,[Right]                ; Load right column
  144.          Sub       CX,[Left]                 ; Subtract left column
  145.          Inc       CX                        ; Get number of columns
  146. Cols:    Lodsb                               ; Get attribute byte
  147.          Mov       [Byte Ptr ES:BX + DI],AL  ; Store attribute byte
  148.          Add       BX,2                      ; Point to next attribute byte
  149.          Loop      Cols                      ; Get next byte
  150.          Pop       CX                        ; Restore row indicator
  151.          Loop      Rows                      ; Do next row
  152.  
  153. Done:    Pop       DI
  154.          Pop       SI
  155.          Pop       DS
  156.          Mov       SP,BP
  157.          Pop       BP
  158.          Ret
  159. Endp     FT_RESTATT
  160. Ends     _NanFor
  161. End
  162.  
  163.  
  164.